package com.wuxi.common.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Getter;

import java.io.File;
import java.io.IOException;

public class JsonUtils {
    /**
     * -- GETTER --
     *  获取ObjectMapper实例
     */
    // 单例ObjectMapper实例
    @Getter
    private static final ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    // 私有构造函数，防止实例化
    private JsonUtils() {}

    /**
     * 将JSON字符串转换为指定类型的对象
     */
    public static <T> T fromJson(String json, Class<T> clazz) throws JsonProcessingException {
        return objectMapper.readValue(json, clazz);
    }

    /**
     * 将JSON字符串转换为指定类型的对象，忽略未知属性
     * 不需要JSON字段与对象属性一一对应
     */
    public static <T> T fromJsonFlexible(String json, Class<T> clazz) throws JsonProcessingException {
        if (json == null || json.trim().isEmpty()) {
            return null;
        }
        return objectMapper.readValue(json, clazz);
    }

    /**
     * 将JSON文件转换为指定类型的对象
     */
    public static <T> T fromJsonFile(File file, Class<T> clazz) throws IOException {
        return objectMapper.readValue(file, clazz);
    }

    /**
     * 将对象转换为JSON字符串
     */
    public static String toJson(Object obj) throws JsonProcessingException {
        return objectMapper.writeValueAsString(obj);
    }

    /**
     * 将对象写入JSON文件
     */
    public static void toJsonFile(Object obj, File file) throws IOException {
        objectMapper.writeValue(file, obj);
    }

    /**
     * 解析JSON字符串为JsonNode
     */
    public static JsonNode parseJson(String json) throws JsonProcessingException {
        return objectMapper.readTree(json);
    }

    /**
     * 将多行JSON字符串转换为单行
     * @param multiLineJson 多行JSON字符串
     * @return 单行JSON字符串，如果转换失败则返回原始字符串
     */
    public static String toSingleLine(String multiLineJson) {
        if (multiLineJson == null || multiLineJson.trim().isEmpty()) {
            return multiLineJson;
        }

        try {
            // 解析JSON为对象
            JsonNode jsonNode = objectMapper.readTree(multiLineJson);
            // 转换为紧凑的单行JSON（无缩进、无换行）
            return objectMapper.writeValueAsString(jsonNode);
        } catch (JsonProcessingException e) {
            // 若JSON格式错误，返回原始字符串
            return multiLineJson;
        }
    }

}
